#ifndef MDATETIME_H
#define MDATETIME_H

#include "MTime.h"
#include "MDate.h"

// 精度为 纳秒 时只支持1970正负289年即  1681年 - 2259年
// 精度为 微秒 时支持公元前后各28.9万年
// 精度为 毫秒 时支持公元前后各2.8亿年

class MDateTime : public QDateTime
{
public:
    MDateTime();
    MDateTime( QDate & date );
    MDateTime( QDate & date, QTime & time, Qt::TimeSpec spec = Qt::LocalTime );
    MDateTime( QDate & date, MTime & time, Qt::TimeSpec spec = Qt::LocalTime );
    MDateTime( QDateTime & other );
    MDateTime( MDateTime & other );

    //设置系统日期
    static bool setSystemDate    ( int year  = QDate::currentDate().year(),
                              int month = QDate::currentDate().month(),
                              int day   = QDate::currentDate().day());

    //设置系统时间
    static bool setSystemTime    ( int hour  = QTime::currentTime().hour(),
                              int minute= QTime::currentTime().minute(),
                              int second= QTime::currentTime().second(),
                              int msec  = QTime::currentTime().msec());

    //设置系统日期时间
    static bool setSystemDateTime( int year  = QDate::currentDate().year(),
                                  int month = QDate::currentDate().month(),
                                  int day   = QDate::currentDate().day(),
                                  int hour  = QTime::currentTime().hour(),
                                  int minute= QTime::currentTime().minute(),
                                  int second= QTime::currentTime().second(),
                                  int msec  = QTime::currentTime().msec());
    //设置系统日期时间  ----重载
    static bool setSystemDateTime( QDateTime& dt);

    //设置系统日期时间  ----重载
    static bool setSystemDateTime( MDateTime& dt);

    //设置系统日期的年
    static bool setSystemYear    ( int year  = QDate::currentDate().year());

    //设置系统日期的月
    static bool setSystemMonth   ( int month = QDate::currentDate().month());

    //设置系统日期的日
    static bool setSystemDay     ( int day   = QDate::currentDate().day());

    //设置系统日期的时
    static bool setSystemHour    ( int hour  = QTime::currentTime().hour());

    //设置系统日期的分
    static bool setSystemMinute  ( int minute= QTime::currentTime().minute());

    //设置系统日期的秒
    static bool setSystemSecond  ( int second= QTime::currentTime().second());

    //设置系统日期的毫秒
    static bool setSystemMSec    ( int msec  = QTime::currentTime().msec());

    static MDateTime currentDateTime();

    static qint64   currentMSecsSinceEpoch(); // 精度为 毫秒 时支持公元前后各2.8亿年
    static qint64   currentUSecsSinceEpoch(); // 精度为 微秒 时支持公元前后各28.9万年
    static qint64   currentNSecsSinceEpoch(); // 精度为 纳秒 时只支持1970正负289年即  1681年 - 2259年

    static MDateTime fromMSecsSinceEpoch( qint64 msecs );
    static MDateTime fromUSecsSinceEpoch( qint64 uSecs );
    static MDateTime fromNSecsSinceEpoch( qint64 nSecs );

    qint64 toUSecsSinceEpoch();
    qint64 toNSecsSinceEpoch();

    QString toString(const QString & format) const;

    MDate date();
    MTime time();

private:
    MTime m_time;

};


#endif // MDATETIME_H
